<?php
	require_once(dirname(__FILE__).'/incluir.php');
	require_once(dirname(__FILE__).'/dados.php');
	// ########################################
	// # Classe com funções de login e logout #
	// ########################################
	class GerenciadorLogin
	{
		private $tabela;
		private $login;
		private $senha;
		public $verificar_cookie;
		public $erros;
		
		public function __construct($tabela = null, $login = null, $senha = null, $verificar_session = true, $verificar_cookie = false)
		{
			$this->verificar_cookie = isset($verificarCookie) ? $verificarCookie : $this->verificar_cookie;
			// Tenta pegar os valores da Session
			if($verificar_session)
			{
				$session = new Session();
				$this->login = isset($session->login) ? $session->login : $this->login;
				$this->senha = isset($session->senha) ? $session->senha : $this->senha;
				$this->tabela = isset($session->tabela) ? $session->tabela : $this->tabela;
			}
			// Tenta pegar os valores do cookie, se tiver coloca na session
			if($this->verificar_cookie)
			{
				$cookie = new Cookie($prefixo_projeto.'login'); // ve se foi salvo no cookie
				$this->login = $cookie->login;
				$this->senha = $cookie->senha;
				$this->tabela = $cookie->tabela;
				// Coloca na session para facilitar
				$session = new Session();
				$session->login = $this->login;
				$session->senha = $this->senha;
				$session->tabela = $this->tabela;
			}
			// Pega os valores dos parametros
			$this->login = isset($login) ? $login : $this->login;
			$this->senha = isset($senha) ? $senha : $this->senha;
			$this->tabela = isset($tabela) ? $tabela : $this->tabela;
		}
		
		private function valida_login_senha($nome_campo_login)
		{
			if(empty($this->login))
				$this->erros[$nome_campo_login] = "O campo $nome_campo_login não pode estar vazio";
			if(empty($this->senha))
				$this->erros['senha'] = "O campo senha não pode estar vazio";
			
			return empty($this->erros);
		}
		
		// Função para logar um usuário no site
		// Se o retorno passado for um array, admite que a chave do array é o nivel e o valor é o endereço de retorno
		public function logar($retorno = '../', $post = null, $tabela = null, $nome_campo_login = null, $mensagem_erro = 'Erro ao efetuar o login, verifique se o login e a senha foram digitados corretamente')
		{
			$sqlController = new MySQLController(); // inicia o controlador do BD
			$nome_campo_login = isset($nome_campo_login) ? $nome_campo_login : 'login'; // por padrão o campo será chamado de login
			
			// Tenta pegar dos parametros valores pro login, pra senha e pra tabela
			if(isset($post))
			{
				$this->login =  $post[$nome_campo_login];
				$this->senha =  $post['senha'];
			}
			$this->tabela = isset($tabela) ? $tabela : $this->tabela;
			if(empty($this->tabela)) // Se não tiver sido passado nenhuma tabela, assume que a tabela é a de Usuario
				$this->tabela = "usuario";
						
			if($this->valida_login_senha($nome_campo_login))
			{
				$session = new Session();					
				// Passo o login, a senha e qual a tabela que deve ser olhada para ver se o usuário efetuou o login com sucesso
				if( ( $usuario_logado = $sqlController->login($this->login, $this->senha, $this->tabela, $nome_campo_login) ) != false)
				{
					if(array_key_exists('nivel', $usuario_logado)) // Se existe nivel nessa tabela
					{
						$nivel = $usuario_logado['nivel']; // Usa ele
					}
					else
					{
						$nivel = ($post['login'] == 'admin') ? 1 : 0; // Se for admin o nível de acesso é 1, se não é 0
					}
					$session->login($usuario_logado['id'], $this->tabela, $nivel); // Passa o id do usuário logado e o seu nivel de acesso para a session
					if(is_array($retorno))
					{
						header('Location: '.$retorno[$nivel]);
					}
					else
					{
						header('Location: '.$retorno);
					}
				}
				else // se entrou aqui, quer dizer que o usuário errou algum dado ao efetuar o login
				{
					$this->erros['logar'] = $mensagem_erro;
				}
			}
		}
		
		// Testa se o usuário está logado
		public function teste_logado() 
		{
			$session = new Session();
			return $session->teste_logado();	
		}
		
		// Testa se o usuário está logado, se não estiver redireciona o usuário
		public function esta_logado($retorno = '../', $mensagem_erro = 'Você não está logado')
		{
			// Se não está logado, redireciona para o valor do parâmetro $retorno
			if(!$this->teste_logado())
			{
				$session = new Session();
				$session->set_session_msg('ERRO', $mensagem_erro);
				header('Location: '.$retorno);
				return false;
			}
			return true;
		}

		// Verifica se o usuário está logado e tem o nivel para acessar aquela página
		public function esta_logado_nivel($nivel, $retorno = '../', $mensagem_erro = 'Você não tem permissão para acessar esse local')
		{
			if($this->esta_logado()) // Se estiver logado, verifica se realmente o usuário tem nivel para acessar aquela página
			{
				$session = new Session();
				if($session->nivel < $nivel) // Se não tiver nivel retorna o usuário para o valor de $retorno 
				{
					$session = new Session();
					$session->set_session_msg('ERRO', $mensagem_erro);
					header('Location: '.$retorno);
					return false;
				}				
			}
			return true;
		}
		
		// Testa se o usuário está logado, se não estiver ou se não for o administrador redireciona o usuário
		public function administrador($retorno = '../', $mensagem_erro = 'Você não tem permissão para acessar esse local')
		{
			return $this->esta_logado_nivel(1, $retorno, $mensagem_erro); // Assume que o nivel do administrador é 1
		}
		
		public function logout($retorno = '../')
		{
			$session = new Session();
			$session->logout();
			header('Location: '.$retorno);
		}		
	}
?>
